package org.zhang.core.track;

import com.alibaba.ttl.TransmittableThreadLocal;

/**
 * 基于 alibaba 的 TransmittableThreadLocal 实现的线程级别的容器类.
 * 当跨越线程时, 会针对 CallSpan 类型的数据做深拷贝操作, 其他类型的
 * 数据做浅拷贝操作
 *
 * @author tameti
 */
public class CallSpanThreadLocal<T> extends TransmittableThreadLocal<T> {

    @Override
    @SuppressWarnings("unchecked")
    public T copy(T parentSpan) {
        // 只针对 CallSpan 对深拷贝, 针对其他的值做浅拷贝
        if (parentSpan instanceof CallSpan) {
            return (T) ((CallSpan) parentSpan).clone();
        }
        return parentSpan;
    }

    @Override
    @SuppressWarnings("unchecked")
    protected T childValue(T parentSpan) {
        // 只针对 CallSpan 对深拷贝, 针对其他的值做浅拷贝
        if (parentSpan instanceof CallSpan) {
            return (T) ((CallSpan) parentSpan).clone();
        }
        return parentSpan;
    }
}